package com.ref.demo13;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

/**
 * @ClassName BeanUtil
 * @Description TODO
 * @Author Kx
 * @Date 2025/3/25 9:35
 * @Version 1.0
 */
public class BeanUtil {
    /***
     * @author: kx
     * @date: 2025/3/25 9:36
     * @param bean 需要设置的对象
     * @param proper 设置的属性名
     * @param value 设置的属性值
     * @description: 设置对象的属性值
    */
    public static void setProperty(Object bean, String proper,Object value) {
        try {
            // 获取PropertyDescriptor 对象
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(proper, bean.getClass());

            // 获取需要设置的属性相对应的set方法
            Method writeMethod = propertyDescriptor.getWriteMethod();

            // 调用方法
            writeMethod.invoke(bean,value);
            System.out.println("设置成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /***
     * @author: kx
     * @date: 2025/3/25 9:46
     * @param bean 需要设置的对象
     * @param proper 需要查询的属性名
     * @return java.lang.Object  获取到的值
     * @description:
    */
    public static Object getProperty(Object bean,String proper){
        try {
            // 获取BeanInfo 对象
            BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(), Object.class);

            // 获取所有属性
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

            // 循环遍历所有属性
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors){
                // 判断是否与需要查询的属性名相同
                if (propertyDescriptor.getName().equals(proper)){
                    // 获取get方法
                    Method readMethod = propertyDescriptor.getReadMethod();
                    // 调用方法
                    return readMethod.invoke(bean);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /***
     * @author: kx
     * @date: 2025/3/25 9:54
     * @param source 被复制对象
     * @param target 存储对象
     * @description: 复制某个对象的属性值到另一个对象中
    */
    public static void copyProperties(Object source,Object target){
        try {
            // 获取被复制对象的BeanInfo对象
            BeanInfo sourceInfo = Introspector.getBeanInfo(source.getClass(), Object.class);

            // 获取被复制对象的所有属性
            PropertyDescriptor[] propertyDescriptors = sourceInfo.getPropertyDescriptors();

            // 循环遍历所有属性
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors){
                // 获取被复制对象的属性名
                String name = propertyDescriptor.getName();

                // 获取复制对象的属性值
                Object property = getProperty(source, name);

                // 设置复制对象的属性值
                setProperty(target, name, property);
            }
        } catch (IntrospectionException e) {
            e.printStackTrace();
        }
    }
}
